#pragma once

#include <iostream>
#include <semaphore.h>

namespace mySem{

    class Sem{
    public:
        Sem(int default_value = 1, int default_shared_falg = 0){
            // 第二个参数是信号量在线程间共享还是进程间共享，0是进程间共享
            // 第三个参数是信号量的值
            sem_init(&_sem, default_shared_falg, default_value);
        }

        ~Sem(){
            sem_destroy(&_sem);            
        }

        // 对信号量进行原子性的--操作
        void P(){
            int n = sem_wait(&_sem);
            if(n != 0) {std::cout << "sem wait error" << std::endl;}
        }

        // 对信号量进行原子性的++操作
        void V(){
            int n = sem_post(&_sem);
            if(n != 0) {std::cout << "sem post error" << std::endl;}
        }

    private:
        sem_t _sem;
    };
}